package com.cat.orm.core.db.repository.dao;

import java.util.Collection;
import java.util.List;

/**
 * 基础dao
 * @author Jeremy Feng
 * @date 2024/8/27 11:36
 */
public interface IBaseDao<T> {

    /**
     * 通过默认主键查询出所有数据
     * @param key 主键
     * @return BasePo
     * @date 2020年9月7日下午4:53:28
     */
    T selectByKey(Object key);

    /**
     * 查询所有
     * @return List<BasePo>
     * @date 2020年9月7日下午4:53:48
     */
    List<T> selectAll();

    /**
     * 通过指定索引条件, 查询指定数据.此方法默认使用所有索引
     * @return List<BasePo>
     * @date 2020年9月7日下午4:53:48
     */
    List<T> selectByIndex(Object[] values);

    /**
     * 通过指定索引条件, 查询指定数据.此方法通过组装索引,值实现
     * @return List<BasePo>
     * @date 2020年9月7日下午4:53:48
     */
    List<T> selectByIndex(String[] props, Object[] values);

    /**
     * 插入一个对象
     * @param t 插入数据
     * @return int  返回成功个数
     * @date 2020年11月7日上午9:13:28
     */
    int insert(T t);

    /**
     * 替换一个对象
     * @param t 替换数据
     * @return int  返回成功个数
     * @date 2020年11月7日上午9:13:35
     */
    int replace(T t);

    /**
     * 更新一个对象
     * @param t 更新数据
     * @return int  返回成功个数
     * @date 2020年11月7日上午9:13:45
     */
    int update(T t);

    /**
     * 删除一个对象
     * @param t 删除数据
     * @return int  返回成功个数
     * @date 2020年11月7日上午9:13:52
     */
    int delete(T t);

    /**
     * 删除所有
     * @return int返回成功个数
     * @date 2020年11月7日上午9:13:58
     */
    int deleteAll();

    /**
     * 批量插入
     * @param ts 批量插入集合
     * @return int[]
     * @date 2020年11月7日上午9:14:04
     */
    int[] insertBatch(Collection<T> ts);

    /**
     * 批量删除
     * @param ts 批量删除集合
     * @return int[]
     * @date 2020年11月7日上午9:14:14
     */
    int[] deleteBatch(Collection<T> ts);

    /**
     * 批量更新
     * @param ts 批量更新集合
     * @date 2020年11月7日上午9:14:14
     */
    int[] updateBatch(Collection<T> ts);

    /**
     * 通过sql语句查询,在以上所有语句不能处理业务时, 使用此方法.
     * 因为默认sql不缓存, 所以效率比以上操作相比略低.
     * @param sql 查询sql
     * @return BasePo
     * @date 2020年9月7日下午4:53:28
     */
    Collection<T> selectBySql(String sql);

    /**
     * 执行sql语句
     * @param sql 执行sql
     * @date 2020年9月7日下午4:53:28
     */
    void execute(String sql);


}
